package data

import (
	"glmall-product/internal/conf"

	"github.com/go-kratos/kratos/v2/log"
	"github.com/google/wire"
	"gorm.io/driver/mysql"
	"gorm.io/gorm"
)

// ProviderSet 定义数据提供者集合
var ProviderSet = wire.NewSet(NewData, NewGreeterRepo, NewCategoryRepo)

// Data 包含数据库客户端
type Data struct {
	db *gorm.DB
}

// NewData 创建Data实例（包含数据库初始化）
func NewData(c *conf.Data, logger log.Logger) (*Data, func(), error) {
	// 初始化数据库连接
	db, err := gorm.Open(mysql.Open(c.Database.Source), &gorm.Config{})
	if err != nil {
		return nil, nil, err
	}
	// 获取底层sql.DB以设置连接池
	sqlDB, err := db.DB()
	if err != nil {
		return nil, nil, err
	}

	// 清理函数
	cleanup := func() {
		log.NewHelper(logger).Info("closing the data resources")
		if err := sqlDB.Close(); err != nil {
			log.NewHelper(logger).Errorf("failed to close database: %v", err)
		}
	}

	return &Data{db: db}, cleanup, nil
}
